package org.xurui.bsj.protocol.command.impl;

import org.hswebframework.web.bean.FastBeanCopier;
import org.jetlinks.core.message.DeviceMessage;
import org.jetlinks.core.message.codec.FromDeviceMessageContext;
import org.jetlinks.core.message.event.EventMessage;
import org.springframework.util.StringUtils;
import org.xurui.bsj.protocol.command.CmdCodec;
import org.xurui.bsj.protocol.enums.CommandEnum;
import org.xurui.bsj.protocol.msg.BsjMessage;
import org.xurui.bsj.protocol.utils.ArrayUtils;
import org.xurui.bsj.protocol.utils.BinaryUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 4.1.4 位置上报
 */
public class CmdCodec_REPORT_LOCATION_INFO implements CmdCodec {
    @Override
    public boolean supportsCmd(String cmd) {
        return CommandEnum.REPORT_LOCATION_INFO.name().equals(cmd);
    }

    @Override
    public List<DeviceMessage> parsePayload(BsjMessage payload, FromDeviceMessageContext context) {
        //例子：[861755058976645,89860802012080190195,202205201123310006,REPORT_LOCATION_INFO,3,20220520112331,339,2E0.000000N0.000000T00000000000000@460!0!9856!74986463!-64@wifi1!28:2C:B2:0D:4E:58!-54#wifi2!B8:F8:83:57:01:62!-57#wifi3!08:F4:58:20:03:E4!-60#wifi4!CC:C2:E0:67:34:29!-70#wifi5!C4:51:8D:96:44:D8!-72#wifi6!48:7D:2E:9F:9B:A1!-74#wifi7!B4:CF:E0:A3:6B:99!-76#wifi8!64:F8:8A:0A:F6:1E!-78#wifi9!B4:CF:E0:A3:66:E1!-79#wifi10!7C:B5:40:66:AA:2A!-80]
        /**
         * 报文体格式： 少于 5 组传全部，最多 5 组，需排除移动 WIFI。 GPS 位置信息
         *              @LBS 数据
         *              @WIFI 数据
         * 字段说明：   1.GPS 位置信息：遵循 NEMA 报文格式 GPS 上报 位置信息，参见附录 A；
         *            2.460,0,9231,2351,-30: LBS 基站数据,MCC 国家码,460 为中国,0:MNC,0为移动, 9231:LAC, 十进制, 2351,CID,十进制 如果 GPS 数据包中状态为 1, 或者经纬度为” 0000.0000N00000.0000E”时,则取 LBS 数据
         *            3.wifi!AC:BC:32:78:A2:5F!-97: 一组 WIFI 信息，wifi 为 SSID，AC:BC:32:78:A2:5F 为 MAC 地址，-97 为信号强度，变量之间用“!”分隔开 WIFI 信息可以有多组，每组之间用“#”分隔
         */
        //设备上报事件
        EventMessage eventMessage = new EventMessage();
        eventMessage.setDeviceId(payload.getHeader().getDeviceNo());
        eventMessage.setEvent(payload.getHeader().getCmd());
        eventMessage.setMessageId(payload.getHeader().getOrderNo());
        eventMessage.setTimestamp(System.currentTimeMillis());
        Map<String, Object> properties = new HashMap<>();
        String tempBody = payload.getTempBody();
        String[] tempBodyArr = tempBody.split("@");
        //properties.put("header", FastBeanCopier.copy(payload.getHeader(), HashMap::new));
        properties.put("header", payload.getHeader().toMap());

        /**
         * GPS 位置信息：遵循 NEMA 报文格式 GPS 上报 位置信息，参见附录 A；
         */
        if(!StringUtils.isEmpty(ArrayUtils.getStrByIndex(tempBodyArr,0))){
            Map map= BinaryUtils.getGps(tempBodyArr[0]);
            properties.put("gpsStatus",map.get("gpsStatus"));
            properties.put("lonBs",map.get("lonBs"));
            properties.put("longitude",map.get("longitude"));
            properties.put("latBs",map.get("latBs"));
            properties.put("latitude",map.get("latitude"));
            properties.put("timeBs",map.get("timeBs"));
            properties.put("time",map.get("time"));
        }

        /**
         *            460,0,9231,2351,-30: LBS 基站数据,MCC 国家码,460 为中国,0:MNC,0 为移动, 9231:LAC, 十进制, 2351,CID,十进制
         *            如果 GPS 数据包中状态为 1, 或者经纬度为” 0000.0000N00000.0000E”时,则取 LBS 数据
         */
        properties.put("LBS",ArrayUtils.getStrByIndex(tempBodyArr,1));
        /**
         * wifi!AC:BC:32:78:A2:5F!-97: 一组 WIFI 信 息，wifi 为 SSID，AC:BC:32:78:A2:5F 为 MAC 地址，-97 为信号强度，变量之间用“!”分隔开 WIFI 信 息可以有多组，每组之间用“#”分隔
         */
        properties.put("wifiArr",ArrayUtils.getStrByIndex(tempBodyArr,2));
        eventMessage.setData(properties);

        //回复消息
        //标识通信方向，取值如下: 1.下发请求 2.下发响应 3.上报请求 4.上报响应
        //说明：平台下发请求标示 1，则终 端响应标示为 2，终端上报接口标 示为 3，平台响应标示为 4
        //组装需要回复设备消息提
        /**
         * 报文体格式： 应答状态（0＝正常，1＝非平台用户，2＝其他异常）
         */
        //示例：[35380100360174,898600MFSSYYGXXXXXXP,201805082000001000,REPORT_LOCATION_INFO,4,20180528111820,1,0]
        payload.setTempReplyBody("0");
        return genDeviceMessage(eventMessage);
    }
}
